// player-handler.js
/**
 * @file 玩家处理模块
 * @description 处理玩家加入、移动、传送等行为
 */
const { MAPS, getMapConfig } = require('../config/game'); // ✅ 导入 getMapConfig
const { updatePlayer, removePlayer, getMapState, findPlayer } = require('./game-state');

/**
 * 处理玩家加入游戏
 * @param {Socket} socket - 客户端 Socket 实例
 * @param {Object} data - { userId, map }
 */
async function handlePlayerJoin(socket, data, jobSocketMap) {
  console.log(data);
  // 1. 解析数据 判断data是否是json格式，需要转成可访问对象
  if (typeof data === 'string') {
    try {
      data = JSON.parse(data);
    } catch (error) {
      socket.emit('error', { message: '数据格式错误' });
      return;
    }
  }
  // 2. 检查 id(jobId)
  if (!data?.id) {
    socket.emit('error', { message: '角色id为空' });
    return;
  }
  // 判断当前玩家是否已经在其他地图
  const jobId = data.id;
  const mapId = data.map || '00000001';

  // 3. 检查是否已用该 jobId 进入游戏（防重复 join）
  if (jobSocketMap.has(jobId)) {
    const oldSocket = jobSocketMap.get(jobId);
    if (oldSocket !== socket) {
      oldSocket.emit('error', { message: '该角色已在其他设备登录' });
      oldSocket.disconnect();
    }
  }

  // 4. 更新 socket 的 jobId
  socket.jobId = jobId;

  // 5. 存入 jobId 映射（用于后续操作，如 GM 踢人、广播给某角色）
  jobSocketMap.set(jobId, socket);

  // 6. 获取地图配置
  const mapConfig = await getMapConfig(mapId);
  if (!mapConfig) {
    return socket.emit('error', { message: '地图不存在' });
  }

  const { width, height, entrances } = mapConfig;
  const entrance = entrances[0];
  const x = entrance?.x || Math.random() * (width - 200) + 100;
  const y = entrance?.y || Math.random() * (height - 200) + 100;

  // 7. 构造玩家数据
  const playerData = { id: jobId, x, y, map: mapId };
  // 在sjk查询玩家信息
  
  // 8. 更新游戏状态
  updatePlayer(mapId, jobId, playerData);
  socket.join(mapId);

  // 9. 返回成功
  socket.emit('joined', {
    jobId,
    map: mapId,
    player: playerData,
    state: getMapState(mapId)
  });

  // 10. 广播给同地图玩家
  socket.to(mapId).emit('playerJoin', playerData);
  socket.to(mapId).emit('chat', {
    type: 'system',
    text: `${jobId} 进入了 ${mapId}`,
    map: mapId
  });

  console.log(`[Join] 玩家 ${jobId} 加入地图 ${mapId}`);
}

/**
 * 处理玩家移动
 * @param {Socket} socket - 客户端 Socket 实例
 * @param {Object} data - { x, y }
 */
function handlePlayerMove(socket, data) {
  const { x, y } = data;
  const playerInfo = findPlayer(socket.id);
  if (!playerInfo) return;
  const { map: currentMap, player } = playerInfo;
  player.x = x;
  player.y = y;

  // 更新状态
  updatePlayer(currentMap, socket.id, player);

  // 广播移动
  socket.to(currentMap).emit('playerMove', player);
}

/**
 * 处理地图传送
 * @param {Socket} socket - 客户端 Socket 实例
 * @param {string} targetMap - 目标地图 ID
 * @param {string} target_x - 目标地图的 x 坐标
 * @param {string} target_y - 目标地图的 y 坐标
 * 
 * 

 */
function handleTeleport(socket, Data) {
  const { targetMap, target_x, target_y } = Data
  if (!MAPS.includes(targetMap)) return;
  const playerInfo = findPlayer(socket.id);
  const currentMap = playerInfo?.map || null;
  const userId = playerInfo?.player.userId || '未知玩家';

  // 离开原地图
  if (currentMap) {
    socket.leave(currentMap);
    removePlayer(currentMap, socket.id);
    socket.to(currentMap).emit('playerLeave', socket.id);
    socket.to(currentMap).emit('chat', {
      type: 'system',
      text: `${userId} 传送到 ${targetMap}`,
      map: currentMap
    });
  }

  // ✅ 获取目标地图的尺寸
  const mapConfig = getMapConfig(targetMap);
  if (!mapConfig) {
    socket.emit('error', { message: '地图配置不存在' });
    return;
  }
  // 随机出生点（保持在安全区域内）
  let x = target_x;
  let y = target_y;
  // 如果target_x,target_y则直接拿地图上的第一个传送点坐标
  if (!target_x || !target_y) {
    const { width, height, entrances } = mapConfig;
    const entrance = entrances[0];
    if (!entrance) {
      x = Math.random() * (width - 200) + 100;
      y = Math.random() * (height - 200) + 100;
    } else {
      x = entrance.x;
      y = entrance.y;
    }
  }

  const newPlayerData = {
    userId,
    x, y
  };

  // 加入新地图
  updatePlayer(targetMap, socket.id, newPlayerData);
  socket.join(targetMap);

  // 发送新状态
  socket.emit('teleported', {
    map: targetMap,
    state: getMapState(targetMap)
  });

  // 广播加入
  socket.to(targetMap).emit('playerJoin', {
    id: socket.id,
    ...newPlayerData,
    map: targetMap
  });

  socket.to(targetMap).emit('chat', {
    type: 'system',
    text: `${userId} 来到了 ${targetMap}`,
    map: targetMap
  });
}

module.exports = {
  handlePlayerJoin,
  handlePlayerMove,
  handleTeleport
};